//// 类中有指针成员,默认拷贝构造 会有浅拷贝缺陷
//#include <iostream>
//#include <cstring>
//using namespace std;
//// 模拟C++标准的string类,实现自己的String类
//class String {
//public:
//    String(const char* psz = "") :m_psz(new char[strlen(psz) + 1]) {
//        // [char* m_psz = new char[strlen(psz)+1];] // 动态资源
//        strcpy(m_psz, psz);
//    }
//    ~String( /* Strng* this */) {
//        delete[] this->m_psz;
//        // 释放m_psz本身所占用内存空间
//    }
//    char* c_str() { return m_psz; }
//    // 默认的拷贝构造
///*  String( const String& that) {
//        [char* m_psz = that.m_psz;] 只复制了地址,没有复制地址指向的数据-->浅拷贝
//    }*/
//    // 深拷贝构造函数(体现的是资源的重建)
//    String(/*String* this */const String& that) :m_psz(new char[strlen(that.m_psz) + 1]) {
//        // [char* m_psz = new char[strlen(that.m_psz)+1];]
//        strcpy(m_psz, that.m_psz); // 不复制地址,复制地址指向的数据-->深拷贝    
//        cout << "String类的拷贝构造函数被调用" << endl;
//    }
//    // 转移构造函数(体现的是资源的转移)
//    String(/* String* this */String&& that) :m_psz(that.m_psz) {
//        // [char* m_psz = that.m_psz] 只复制了地址,没有复制地址指向的数据
//        that.m_psz = NULL;
//        cout << "String类的转移构造函数被掉用" << endl;
//    }
//
//    // 默认的拷贝赋值函数
//    /*
//    String& operator=( const String& that) {
//        this->m_psz = that.m_psz; 只复制了地址,没有复制地址指向的数据-->浅拷贝
//        return *this;
//    }
//    */
//    // 深拷贝赋值(体现的是资源的重建)
//    String& operator=( /* String* this */ const String& that) {
//        cout << "String类的拷贝赋值函数被调用" << endl;
//        if (this != &that) { // 防止自赋值
//            delete[] this->m_psz; // 释放旧资源
//            this->m_psz = new char[strlen(that.m_psz) + 1]; // 申请新资源
//            strcpy(this->m_psz, that.m_psz);  // 拷贝新内容
//        }
//        return *this;  // 返回自引用
//    }
//    // 转移赋值函数(体现出的是资源的转移)
//    String& operator=(/*String* this*/String&& that) {
//        cout << "String类的转移赋值函数被调用" << endl;
//        delete[] this->m_psz;
//        this->m_psz = that.m_psz; // 只复制了地址,没有复制地址指向的数据
//        that.m_psz = NULL;
//        return *this;
//    }
//private:
//    char* m_psz;  // 指针成员
//    friend ostream& operator<<(ostream& os, const String& str);
//};
//// 模拟类的设计者(类库\别人设计的类\自己设计的类)
//// ----------------------------------------------
//// 模拟用户(使用类的人)
//
//ostream& operator<<(ostream& os, const String& str) {
//    return os << str.m_psz;
//}
//
//int main(void) {
//    String s1("Hello");
//    cout << "------------------1----------------" << endl;
//    String s2(s1);  // 定义s2,利用s2.String(s1)--> 深拷贝构造函数
//
//    cout << "------------------2----------------" << endl;
//    String s3 = String("World"); // 定义s3,利用s3.String(String("world")) --转移构造
//
//    cout << "------------------3----------------" << endl;
//    String s4;
//    s4 = s3;  // s4.operator=(s3) -- 深拷贝赋值
//
//    cout << "------------------4----------------" << endl;
//    s4 = String("world"); // s4.operator(String("world")) -- 深拷贝赋值
//    return 0;
//}
